import axios from 'axios'
import { SESSION_LAST_CODE, SESSION_MEMBER_INFO } from '@/utils/baseConfig' // 引入环境变量配置[1,9](@ref)
import { showLoadingToast, closeToast, showFailToast } from 'vant' // 可选：根据你的UI库引入提示组件，如 Element-UI, Vant 等
// 创建 axios 实例
const service = axios.create({
  baseURL: '', // 从环境变量读取接口基础地址[1,9](@ref)
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json;charset=UTF-8',
    //'Content-Type': 'application/x-www-form-urlencoded',
  }, // 默认请求头
})

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    showLoadingToast({
      message: '加载中...',
      forbidClick: true,
    }) // 可选：显示全局 Loading[8](@ref)
    config.url = '' + config.url // 假设 Vite 代理配置中使用了 /api 作为前缀
    // 自动携带 token：从本地存储获取 token 并添加到请求头[1,2,8](@ref)
    const code = localStorage.getItem(SESSION_LAST_CODE) //获取微信code
    console.log('code:' + code)
    const memberInfo = localStorage.getItem(SESSION_MEMBER_INFO + code) || null
    if (code) {
      config.headers['code'] = code // 常见格式，根据后端要求调整
    }
    if (null != memberInfo) {
      const user = JSON.parse(memberInfo)
      config.headers['openId'] = user.openId // 常见格式，根据后端要求调整
    }
    return config
  },
  (error) => {
    // 对请求错误做些什么（如网络错误、配置错误等）
    showFailToast(error.message)
    closeToast() // 可选：隐藏 Loading
    return Promise.reject(error)
  },
)

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    closeToast() // 可选：隐藏 Loading

    // 如果响应是二进制数据（如文件下载），直接返回[8](@ref)
    if (response.config.responseType === 'blob') {
      return response.data
    }

    const res = response.data // 获取响应数据

    // 假设后端统一返回格式为 { code, message, data }，且 code 为 200 表示成功[1,8](@ref)
    if (res.code === 401) {
      showFailToast('登录已过期，请重新登录')
    } else {
      return res // 返回核心数据，这样在组件中 then 接收到的就是 res.data
    }
  },
  (error) => {
    showFailToast(error) // 提示错误信息
    closeToast() // 隐藏 Loading
    // 对响应错误做点什么（HTTP 状态码非 2xx，或网络错误、超时等）[8](@ref)
    let message = '网络连接异常'
    if (error.response) {
      // 请求已发出，服务器返回了状态码但不在 2xx 范围内
      switch (error.response.status) {
        case 400:
          message = '请求错误'
          break
        case 401:
          message = '未授权，请登录'
          localStorage.removeItem('token')
          break
        case 403:
          message = '拒绝访问'
          break
        case 404:
          message = `请求地址出错: ${error.response.config.url}`
          break
        case 500:
          message = '服务器内部错误'
          break
        default:
          message = `连接错误 ${error.response.status}`
      }
    } else if (error.message.includes('timeout')) {
      message = '请求超时，请检查网络'
    }
    showFailToast(message) // 提示错误信息
    return Promise.reject(error)
  },
)

export function get(url: string, params = {}, options = {}) {
  return service({
    url,
    method: 'get',
    params, // GET 请求使用 params 传递参数[5](@ref)
    ...options,
  })
}
export function post(url: string, data = {}, options = {}) {
  return service({
    url,
    method: 'post',
    data, // POST 请求使用 data 传递参数[5](@ref)
    ...options,
  })
}

// 可按需封装 put, delete, patch 等方法
export function put(url: string, data = {}, options = {}) {
  return service({
    url,
    method: 'put',
    data,
    ...options,
  })
}
export function isWechat() {
  const ua = navigator.userAgent.toLowerCase()
  const isWeixin = ua.indexOf('micromessenger') != -1
  if (isWeixin) {
    return true
  } else {
    return false
  }
}
// 默认导出实例，也可按需导入特定方法
export default service
